#include<bits/stdc++.h>
using namespace std;
const int NN=304,P=1e9+7;
int a[NN],f[NN],g[NN][NN],n,m;
map<vector<bool>,int>mp;
int get(int x,int y)
{
	return (x-1)*m+y;
}
int dfs(vector<bool>u)
{
	if(mp.count(u))
		return mp[u];
	int p=0;
	for(int i=1;i<=n*m;i++)
		if(!u[i])
		{
			p=i;
			break;
		}
	if(!p)
		return mp[u]=1;
	int x=(p-1)/m+1,y=(p-1)%m+1,res=0,clear;
	for(int i=1;x+i-1<=n;i++)
	{
		if(u[get(x+i-1,y)]||g[x+i-1][y]!=g[x][y])
			break;
		u[get(x+i-1,y)]=true;
		clear=i;
		res=(res+dfs(u))%P;
	}
	for(int i=1;i<=clear;i++)
		u[get(x+i-1,y)]=false;
	for(int i=1;y+i-1<=m;i++)
	{
		if(u[get(x,y+i-1)]||g[x][y+i-1]!=g[x][y])
			break;
		u[get(x,y+i-1)]=true;
		clear=i;
		res=(res+dfs(u))%P;
	}
	for(int i=1;i<=clear;i++)
		u[get(x,y+i-1)]=false;
	return mp[u]=res;
}
int main()
{
	freopen("disanti.in","r",stdin);
	freopen("disanti.out","w",stdout);
	scanf("%d%d",&n,&m);
	if(n==1)
	{
		for(int i=1;i<=m;i++)
			scanf("%1d",&a[i]);
		for(int i=1;i<=m;i++)
		{
			a[i]^=1;
			f[0]=1;
			for(int j=1;j<=m;j++)
			{
				f[j]=0;
				for(int k=j;k;k--)
				{
					if(a[k]!=a[j])
						break;
					f[j]=(f[j]+f[k-1])%P;
				}
			}
			printf("%d ",f[m]);
			a[i]^=1;
		}
	}
	else
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%1d",&g[i][j]);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				g[i][j]^=1;
				mp.clear();
				vector<bool>t;
				for(int i=0;i<=n*m;i++)
					t.push_back(false);
				printf("%d ",dfs(t));
				g[i][j]^=1;
			}
			puts("");
		}
	}
	return 0;
}
